package br.com.imob.modelo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;

/**
 *
 * @author Gilton Nascimento
 */
@Entity
@Table(name = "\"CLIENTE\"", catalog = "imob", schema = "public", uniqueConstraints = {
    @UniqueConstraint(columnNames = {"cliente_id"})})
@NamedQueries({
    @NamedQuery(name = "Cliente.findAll", query = "SELECT c FROM Cliente c"),
    @NamedQuery(name = "Cliente.findByClienteId", query = "SELECT c FROM Cliente c WHERE c.clienteId = :clienteId"),
    @NamedQuery(name = "Cliente.findByPrazo", query = "SELECT c FROM Cliente c WHERE c.prazo = :prazo"),
    
    @NamedQuery(name = "Cliente.findByOrigem", query = "SELECT c FROM Cliente c WHERE c.origem = :origem"),
    @NamedQuery(name = "Cliente.findLikeByOrigem", query = "SELECT c FROM Cliente c WHERE c.origem Like :origem"),
    
    @NamedQuery(name = "Cliente.findByPretensao", query = "SELECT c FROM Cliente c WHERE c.pretensao = :pretensao"),
    @NamedQuery(name = "Cliente.findByLikePretensao", query = "SELECT c FROM Cliente c WHERE c.pretensao Like :pretensao"),
    
    @NamedQuery(name = "Cliente.findByInvestimento", query = "SELECT c FROM Cliente c WHERE c.investimento = :investimento"),
    
    @NamedQuery(name = "Cliente.findByItemNegociado", query = "SELECT c FROM Cliente c WHERE c.itemNegociado = :itemNegociado"),
    @NamedQuery(name = "Cliente.findByLikeItemNegociado", query = "SELECT c FROM Cliente c WHERE c.itemNegociado Like :itemNegociado"),
    
    @NamedQuery(name = "Cliente.findByObservacao", query = "SELECT c FROM Cliente c WHERE c.observacao = :observacao"),
    @NamedQuery(name = "Cliente.findLikeByObservacao", query = "SELECT c FROM Cliente c WHERE c.observacao Like :observacao")
    })
public class Cliente extends ControlEntities implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
//  <editor-fold defaultstate="collapsed" desc="Geradores de Sequencias">
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_STORE")
    @SequenceGenerator(name = "SEQ_STORE", sequenceName = "next_cliente")// </editor-fold>
    @Basic(optional = false)
    
    @Column(name = "cliente_id", nullable = false)
    private Integer clienteId;
    
    @Column(name = "prazo")
    @Temporal(TemporalType.TIME)
    private Date prazo;
    
    @Column(name = "origem", length = 45)
    private String origem;
    
    @Column(name = "pretensao", length = 2147483647)
    private String pretensao;
    
    @Column(name = "investimento", precision = 17, scale = 17)
    private Double investimento;
    
    @Column(name = "item_negociado", length = 80)
    private String itemNegociado;
    
    @Column(name = "observacao", length = 2147483647)
    private String observacao;
    
    @OneToMany(mappedBy = "cliente", fetch = FetchType.LAZY)
    private List<Corretor> corretorList;
    
    @JoinColumn(name = "pessoa_id", referencedColumnName = "pessoa_id", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Pessoa pessoa;
    
    @JoinColumn(name = "finalidade_id", referencedColumnName = "finalidade_id", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Finalidade finalidade;

    public Cliente() {}
    public Cliente(Integer clienteId) { this.clienteId = clienteId; }

    public Cliente(int id, Double invest) {
    	clienteId = id;
    	investimento = invest;
    }
    
    public Cliente(String tpStr, String arg) {
    	if( "origem".equalsIgnoreCase(tpStr) )		origem = arg;
    	if( "pretensao".equalsIgnoreCase(tpStr) )	pretensao = arg;
    	if( "negociado".equalsIgnoreCase(tpStr) )	itemNegociado = arg;
    	if( "observacao".equalsIgnoreCase(tpStr) )	observacao = arg;
    	if( "prazo".equalsIgnoreCase(tpStr) )		prazo = str2Date(arg);
    	if("investimento".equalsIgnoreCase(tpStr))	investimento = str2Double(arg);
    }
    
    public Cliente(int id, String tpStr, String arg) {
    	this(tpStr, arg);
    	clienteId = id;
    }
    
    public Cliente( int id, String strPrazo, String orig, String pretention, 
    		String invest, String negociado, String obs ) {
    	clienteId = id;
    	prazo = str2Date(strPrazo);
    	origem = orig;
    	pretensao = pretention;
    	investimento = str2Double(invest);
    	itemNegociado = negociado;
    	observacao = obs;
    }
    
    public Cliente( int id, String strPrazo, String orig, String pretention, 
    		String invest, String negociado, String obs, Pessoa p ) {
    	this(id, strPrazo, orig, pretention, invest, negociado, obs);
    	pessoa = p;
    }
    
    
//    Getts and Setts
    public Integer getClienteId() {
        return clienteId;
    }

    public void setClienteId(Integer clienteId) {
        this.clienteId = clienteId;
    }

    public String getPraz() {
        return date2String(prazo);
    }
    
    public Date getPrazo() {
    	return prazo;
    }

    public void setPrazo(Date prazo) {
        this.prazo = prazo;
    }

    public String getOrigem() {
        return origem;
    }

    public void setOrigem(String origem) {
        this.origem = origem;
    }

    public String getPretensao() {
        return pretensao;
    }

    public void setPretensao(String pretensao) {
        this.pretensao = pretensao;
    }

    public Double getInvestimento() {
        return investimento;
    }

    public void setInvestimento(Double investimento) {
        this.investimento = investimento;
    }

    public String getItemNegociado() {
        return itemNegociado;
    }

    public void setItemNegociado(String itemNegociado) {
        this.itemNegociado = itemNegociado;
    }

    public String getObservacao() {
        return observacao;
    }

    public void setObservacao(String observacao) {
        this.observacao = observacao;
    }

    public List<Corretor> getCorretorList() {
        return corretorList;
    }

    public void setCorretorList(List<Corretor> corretorList) {
        this.corretorList = corretorList;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    public Finalidade getFinalidade() {
        return finalidade;
    }

    public void setFinalidade(Finalidade finalidade) {
        this.finalidade = finalidade;
    }
    
    public Object[] getValues() {
    	Object[] values = { clienteId, investimento, prazo, itemNegociado, pretensao, origem, observacao };
    	return values;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (clienteId != null ? clienteId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Cliente)) {
            return false;
        }
        Cliente other = (Cliente) object;
        if ((this.clienteId == null && other.clienteId != null) || (this.clienteId != null && !this.clienteId.equals(other.clienteId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.imob.modelo.Cliente[clienteId=" + clienteId + "]";
    }

}
